/**
 *   ┏┓　　　┏┓
 * ┏┛┻━━━┛┻┓
 * ┃　　　　　　　┃
 * ┃　　　━　　　┃
 * ┃　┳┛　┗┳　┃
 * ┃　　　　　　　┃
 * ┃　　　┻　　　┃
 * ┃　　　　　　　┃
 * ┗━┓　　　┏━┛
 *    ┃　　　┃
 *    ┃　　　┃
 *    ┃　　　┗━━━┓
 *    ┃　　　　　　　┣┓
 *    ┃　　　　　　　┏┛
 *    ┗┓┓┏━┳┓┏┛
 *      ┃┫┫　┃┫┫
 *      ┗┻┛　┗┻┛
 *        神兽保佑
 *        代码无BUG!

 * @文件说明： 数码管驱动文件

* @修改记录：   2018/3/16 刘雨
 *
 */
#ifndef __B_MOD_KEYBROAD_H
#define __B_MOD_KEYBROAD_H
#ifdef __cplusplus
extern "C" {
#endif

#include "b_config.h"
#if _KEYBROAD_ENABLE
#include "../inc/b_mod_signalsolts.h"
#include "b_hal.h"
#include "b_mod_timer.h"
typedef struct
{
    bHalGPIOPort_t GPIOx;
    bHalGPIOPin_t  GPIO_Pin;
    uint8_t        eAvtivityState;
} b_keybroad_io_t;

typedef enum
{
    KEY_VALUE_TYPE_CLICK_SINGLE,  //单击
    KEY_VALUE_TYPE_LET_GO,        //抬起
    KEY_VALUE_TYPE_LONG_PRESS,    //长按
    KEY_VALUE_TYPE_PRESS_TIME,    //按下时间
    KEY_VALUE_TYPE_END
} KEY_VALUE_TYPE_T;

typedef struct
{
    B_SIGNAL_T hSignal;

    uint32_t DebounceV;      //连击键值
    uint32_t DebounceCount;  //连击计次

    uint32_t SingleClickV;  //单击
    uint32_t LongPressV;    //长按
    uint32_t LetGoV;        //抬起
    uint32_t LongLetGoV;    //长抬起
    uint8_t  ValidFlag;     //有效标准
    uint32_t PressTime;     //按键时间
#if _KEYBROAD_MATRIX
    const b_keybroad_io_t *pOutPortTable;    //按键表
    uint8_t                unOutPortNumber;  //表数量
    const b_keybroad_io_t *pInPortTable;     //按键表
    uint8_t                unInPortNumber;   //表数量
#endif
#if _KEYBROAD_ALONE
    const b_keybroad_io_t *pPortTable;   //按键表
    uint8_t                nPortNumber;  //表数量
#endif

    bSoftTimerInstance_t sTimer;

} b_keybroad_t;

/******************************************************************
  * @函数说明：   按键扫描构造函数
  * @输入参数：   b_keybroad_io_t *pPinTable,  按键IO表
                  uint8_t nPinNumber        表数量
  * @输出参数：   无
  * @返回参数：   int
  * @修改记录：   ----
******************************************************************/
#if (_KEYBROAD_MATRIX && _KEYBROAD_ALONE)
int b_keybroad_Init(b_keybroad_t *hHnadle, const b_keybroad_io_t *pOutPortTable,
                    uint8_t unOutPortNumber, const b_keybroad_io_t *pInPortTable,
                    uint8_t unInPortNumber, const b_keybroad_io_t *pPortTable, uint8_t nPortNumber);
#elif _KEYBROAD_MATRIX
int b_keybroad_Init(b_keybroad_t *hHnadle, const b_keybroad_io_t *pOutPortTable,
                    uint8_t unOutPortNumber, const b_keybroad_io_t *pInPortTable,
                    uint8_t unInPortNumber);
#elif _KEYBROAD_ALONE
int b_keybroad_Init(b_keybroad_t *hHnadle, const b_keybroad_io_t *pPinTable, uint8_t nPinNumber);
#endif
/******************************************************************
  * @函数说明：   获取按键的值
  * @输入参数：   b_keybroad_t *hHandle,  句柄
                  KEY_VALUE_TYPE_T eType      类型
  * @输出参数：   无
  * @返回参数：   uint32_t value
  * @修改记录：   ----
******************************************************************/
uint32_t b_keybroad_GetKeyValue(b_keybroad_t *hHandle, KEY_VALUE_TYPE_T eType);
/******************************************************************
  * @函数说明：   注册键值改变时的回调函数。 回调时的参数为按键句柄
  * @输入参数：   b_keybroad_t *hHandle, 句柄
                 IMPLE_SOLTS slots,         槽
                  void *pArg                回调时的参数
  * @输出参数：   无
  * @返回参数：   int
  * @修改记录：   ----
******************************************************************/
int b_keybroad_RegisterChangeCB(b_keybroad_t *hHandle, B_SOLTS_ITEM_T *solts, B_SOLTS solts_handle,
                                void *soltsArg);

/******************************************************************
  * @函数说明：  外部写入键值
  * @输入参数：   b_keybroad_t *hHandle, 句柄
                    KEY_VALUE_TYPE_T eType, 类型
                    uint32_t unValue        值  多个值 相与 写入
  * @输出参数：   无
  * @返回参数：   int
  * @修改记录：   ----
******************************************************************/
int b_keybroad_ExternalWrite(b_keybroad_t *hHandle, KEY_VALUE_TYPE_T eType, uint32_t unValue);
#endif
#ifdef __cplusplus
}
#endif
#endif
